package export

import (
	"bytes"
	"fmt"
	"reflect"
	"time"

	"github.com/xuri/excelize/v2"
)

func GenerateExcel(stats map[string]interface{}) ([]byte, string, error) {
	// 实现Excel导出逻辑
	// 创建Excel文件
	f := excelize.NewFile()
	defer func() {
		if err := f.Close(); err != nil {
			fmt.Printf("关闭Excel文件失败: %v\n", err)
		}
	}()

	// 创建基础统计工作表
	baseSheet := "基础统计"
	index, err := f.NewSheet(baseSheet)
	if err != nil {
		return nil, "", fmt.Errorf("创建工作表失败: %w", err)
	}

	// 设置表头
	err = f.SetCellValue(baseSheet, "A1", "统计项")
	if err != nil {
		return nil, "", err
	}
	err = f.SetCellValue(baseSheet, "B1", "数值")
	if err != nil {
		return nil, "", err
	}

	// 设置表头样式
	style, err := f.NewStyle(&excelize.Style{
		Font: &excelize.Font{Bold: true},
		Fill: excelize.Fill{Type: "pattern", Color: []string{"#E0E0E0"}, Pattern: 1},
	})

	if err != nil {
		return nil, "", err
	}
	err = f.SetCellStyle(baseSheet, "A1", "B1", style)
	if err != nil {
		return nil, "", err
	}

	row := 2 // 从第二行开始填充数据

	// 处理基础统计数据
	for key, value := range stats {
		// 跳过嵌套结构，后续单独处理
		if reflect.TypeOf(value).Kind() == reflect.Map ||
			reflect.TypeOf(value).Kind() == reflect.Slice {
			continue
		}

		// 写入数据
		err := f.SetCellValue(baseSheet, fmt.Sprintf("A%d", row), key)
		if err != nil {
			return nil, "", err
		}
		err = f.SetCellValue(baseSheet, fmt.Sprintf("B%d", row), value)
		if err != nil {
			return nil, "", err
		}
		row++
	}

	// 处理嵌套的map类型数据（如状态分布）
	for key, value := range stats {
		if nestedMap, ok := value.(map[string]int); ok {
			sheetName := key
			_, err := f.NewSheet(sheetName)
			if err != nil {
				return nil, "", fmt.Errorf("创建工作表失败: %w", err)
			}

			// 设置嵌套数据的表头
			err = f.SetCellValue(sheetName, "A1", "分类")
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
			}
			err = f.SetCellValue(sheetName, "B1", "数量")
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
			}
			err = f.SetCellStyle(sheetName, "A1", "B1", style)
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头样式失败: %w", err)
			}

			nestedRow := 2
			for nestedKey, nestedValue := range nestedMap {
				err := f.SetCellValue(sheetName, fmt.Sprintf("A%d", nestedRow), nestedKey)
				if err != nil {
					return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
				}
				err = f.SetCellValue(sheetName, fmt.Sprintf("B%d", nestedRow), nestedValue)
				if err != nil {
					return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
				}
				nestedRow++
			}
		}
	}

	// 处理切片类型数据（如月度统计）
	for key, value := range stats {
		if sliceData, ok := value.([]int); ok {
			sheetName := key
			_, err := f.NewSheet(sheetName)
			if err != nil {
				return nil, "", fmt.Errorf("创建工作表失败: %w", err)
			}

			// 设置切片数据的表头
			err = f.SetCellValue(sheetName, "A1", "序号")
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
			}
			err = f.SetCellValue(sheetName, "B1", "数值")
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
			}
			err = f.SetCellStyle(sheetName, "A1", "B1", style)
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头样式失败: %w", err)
			}
			err = f.SetCellValue(sheetName, "B1", "数值")
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
			}
			err = f.SetCellStyle(sheetName, "A1", "B1", style)
			if err != nil {
				return nil, "", fmt.Errorf("设置工作表表头样式失败: %w", err)
			}

			sliceRow := 2
			for i, item := range sliceData {
				err := f.SetCellValue(sheetName, fmt.Sprintf("A%d", sliceRow), i+1)
				if err != nil {
					return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
				}
				err = f.SetCellValue(sheetName, fmt.Sprintf("B%d", sliceRow), item)
				if err != nil {
					return nil, "", fmt.Errorf("设置工作表表头失败: %w", err)
				}
				sliceRow++
			}
		}
	}

	// 设置默认工作表
	f.SetActiveSheet(index)

	// 生成文件名
	filename := fmt.Sprintf("statistics_%s.xlsx", time.Now().Format("20060102150405"))

	// 写入到字节缓冲区
	var buf bytes.Buffer
	if _, err := f.WriteTo(&buf); err != nil {
		return nil, "", fmt.Errorf("写入Excel数据失败: %w", err)
	}

	return buf.Bytes(), filename, nil
}
